home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / v10n07.arc / PALETTE.ARC / TUNNEL.ARC / TUNNEL.C < prev    next >
C/C++ Source or Header  |  1991-03-27  |  7KB  |  219 lines

  1. /*-----------------------------------------------------------------
  2.    TUNNEL.C -- Palette Animation Using Windows 3.0 Palette Manager
  3.               (c) Charles Petzold, 1990
  4.   -----------------------------------------------------------------*/
  5.  
  6. #include <windows.h>
  7.  
  8. long FAR PASCAL WndProc (HWND, WORD, WORD, LONG) ;
  9.  
  10. int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
  11.                     LPSTR lpszCmdLine, int nCmdShow)
  12.      {
  13.      char     szAppName [] = "Tunnel" ;
  14.      HWND     hwnd ;
  15.      MSG      msg ;
  16.      WNDCLASS wndclass ;
  17.  
  18.      if (!hPrevInstance) 
  19.           {
  20.           wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  21.           wndclass.lpfnWndProc   = WndProc ;
  22.           wndclass.cbClsExtra    = 0 ;
  23.           wndclass.cbWndExtra    = 0 ;
  24.           wndclass.hInstance     = hInstance ;
  25.           wndclass.hIcon         = NULL ;
  26.           wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  27.           wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
  28.           wndclass.lpszMenuName  = szAppName ;
  29.           wndclass.lpszClassName = szAppName ;
  30.  
  31.           RegisterClass (&wndclass) ;
  32.           }
  33.  
  34.      hwnd = CreateWindow (szAppName, "Tunnel: Palette Animation",
  35.                           WS_OVERLAPPEDWINDOW,
  36.                           CW_USEDEFAULT, CW_USEDEFAULT,
  37.                           CW_USEDEFAULT, CW_USEDEFAULT,
  38.                           NULL, NULL, hInstance, NULL) ;
  39.  
  40.      ShowWindow (hwnd, nCmdShow) ;
  41.      UpdateWindow (hwnd) ;
  42.  
  43.      while (GetMessage (&msg, NULL, 0, 0))
  44.           {
  45.           TranslateMessage (&msg) ;
  46.           DispatchMessage (&msg) ;
  47.           }
  48.      return msg.wParam ;
  49.      }
  50.  
  51. long FAR PASCAL WndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
  52.      {
  53.      static HPALETTE    hPal ;
  54.      static LOCALHANDLE hLocalMem ;
  55.      static LOGPALETTE *plp ;
  56.      static short       cxClient, cyClient, iLevel ;
  57.      BOOL            bPalSupport ;
  58.      HBRUSH          hBrush ;
  59.      HDC             hdc ;
  60.      long            i ;
  61.      PAINTSTRUCT     ps ;
  62.      RECT            rc ;
  63.      WORD            nGrayLevel ;
  64.  
  65.      switch (message)
  66.           {
  67.           case WM_CREATE:
  68.  
  69.                     // Check for palette support
  70.  
  71.                hdc = GetDC (hwnd) ;
  72.  
  73.                bPalSupport = (RC_PALETTE & GetDeviceCaps (hdc, RASTERCAPS)) &&
  74.                              (GetDeviceCaps (hdc, SIZEPALETTE) -
  75.                               GetDeviceCaps (hdc, NUMRESERVED) > 128) ;
  76.  
  77.                ReleaseDC (hwnd, hdc) ;
  78.  
  79.                if (!bPalSupport)
  80.                     {
  81.                     MessageBox (hwnd, "Program requires palette support",
  82.                                 "Tunnel", MB_ICONEXCLAMATION | MB_OK) ;
  83.  
  84.                     DestroyWindow (hwnd) ;
  85.                     return 0 ;
  86.                     }
  87.  
  88.  
  89.                     // Allocate memory for LOGPALETTE structure and lock it
  90.  
  91.                hLocalMem = LocalAlloc (LMEM_MOVEABLE, sizeof (LOGPALETTE) +
  92.                                                 255 * sizeof (PALETTEENTRY)) ;
  93.  
  94.                plp = (LOGPALETTE *) LocalLock (hLocalMem) ;
  95.  
  96.                     // Initialize the fields of the LOGPALETTE structure
  97.  
  98.                plp->palVersion    = 0x300 ;
  99.                plp->palNumEntries = 128 ;
  100.  
  101.                for (i = 0 ; i < 128 ; i++)
  102.                     {
  103.                     if (i < 64)
  104.                          nGrayLevel = 4 * i ;
  105.                     else
  106.                          nGrayLevel = min (255, 4 * (128 - i)) ;
  107.  
  108.                     plp->palPalEntry[i].peRed   = nGrayLevel ;
  109.                     plp->palPalEntry[i].peGreen = nGrayLevel ;
  110.                     plp->palPalEntry[i].peBlue  = nGrayLevel ;
  111.                     plp->palPalEntry[i].peFlags = PC_RESERVED ;
  112.  
  113.                     plp->palPalEntry[i + 128].peRed   = nGrayLevel ;
  114.                     plp->palPalEntry[i + 128].peGreen = nGrayLevel ;
  115.                     plp->palPalEntry[i + 128].peBlue  = nGrayLevel ;
  116.                     plp->palPalEntry[i + 128].peFlags = PC_RESERVED ;
  117.                     }
  118.  
  119.                     // Create the logical palette
  120.  
  121.                hPal = CreatePalette (plp) ;
  122.  
  123.                     // Unlock the memory block
  124.  
  125.                LocalUnlock (hLocalMem) ;
  126.  
  127.                SetTimer (hwnd, 1, 50, NULL) ;
  128.                return 0 ;
  129.  
  130.           case WM_SIZE:
  131.                cxClient = LOWORD (lParam) ;
  132.                cyClient = HIWORD (lParam) ;
  133.                return 0 ;
  134.  
  135.           case WM_TIMER:
  136.                plp = (LOGPALETTE *) LocalLock (hLocalMem) ;
  137.  
  138.                iLevel = (iLevel + 1) % 128 ;
  139.  
  140.                AnimatePalette (hPal, 0, 128, plp->palPalEntry + iLevel) ;
  141.  
  142.                     // Unlock the memory block
  143.  
  144.                LocalUnlock (hLocalMem) ;
  145.                return 0 ;
  146.  
  147.           case WM_PAINT:
  148.                hdc = BeginPaint (hwnd, &ps) ;
  149.  
  150.                SelectPalette (hdc, hPal, FALSE) ;
  151.                RealizePalette (hdc) ;
  152.  
  153.                for (i = 0 ; i < 127 ; i++)
  154.                     {
  155.                          // Use a RECT structure for each of 128 rectangles
  156.  
  157.                     rc.left   = (short) (           i * cxClient / 255) ;
  158.                     rc.top    = (short) (           i * cyClient / 255) ;
  159.                     rc.right  = (short) (cxClient - i * cxClient / 255) ;
  160.                     rc.bottom = (short) (cyClient - i * cyClient / 255) ;
  161.  
  162.                     hBrush = CreateSolidBrush (PALETTEINDEX (i)) ;
  163.  
  164.                          // Fill the rectangle and delete the brush
  165.  
  166.                     FillRect (hdc, &rc, hBrush) ;
  167.                     DeleteObject (hBrush) ;
  168.                     }
  169.  
  170.                EndPaint (hwnd, &ps) ;
  171.                return 0 ;
  172.  
  173.           case WM_QUERYNEWPALETTE:
  174.                hdc = GetDC (hwnd) ;
  175.  
  176.                SelectPalette (hdc, hPal, FALSE) ;
  177.  
  178.                if (RealizePalette (hdc) > 0)
  179.                     {
  180.                     ReleaseDC (hwnd, hdc) ;
  181.                     InvalidateRect (hwnd, NULL, FALSE) ;
  182.                     return TRUE ;
  183.                     }
  184.                else
  185.                     {
  186.                     ReleaseDC (hwnd, hdc) ;
  187.                     return FALSE ;
  188.                     }
  189.                break ;
  190.  
  191.           case WM_PALETTECHANGED:
  192.                if (wParam != hwnd)
  193.                     {
  194.                     hdc = GetDC (hwnd) ;
  195.  
  196.                     SelectPalette (hdc, hPal, FALSE) ;
  197.  
  198.                     if (RealizePalette (hdc) > 0)
  199.                          {
  200.                          InvalidateRect (hwnd, NULL, FALSE) ;
  201.                          }
  202.  
  203.                     ReleaseDC (hwnd, hdc) ;
  204.                     }
  205.                return 0 ;
  206.  
  207.           case WM_DESTROY :
  208.                KillTimer (hwnd, 1) ;
  209.                LocalFree (hLocalMem) ;
  210.  
  211.                     // Delete the logical palette
  212.  
  213.                DeleteObject (hPal) ;
  214.                PostQuitMessage (0) ;
  215.                return 0 ;
  216.           }
  217.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  218.      }
  219.